package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.commons.exception.ServiceException;
import cn.tedu.csmall.commons.pojo.vo.PageData;
import cn.tedu.csmall.commons.web.ServiceCode;
import cn.tedu.csmall.product.mapper.*;
import cn.tedu.csmall.product.pojo.entity.*;
import cn.tedu.csmall.product.pojo.param.AttributeTemplateInsertParam;
import cn.tedu.csmall.product.pojo.param.AttributeTemplateUpdateInfoParam;
import cn.tedu.csmall.product.pojo.vo.AttributeTemplateListVO;
import cn.tedu.csmall.product.pojo.vo.AttributeTemplateStandardVO;
import cn.tedu.csmall.product.service.AttributeTemplateService;
import cn.tedu.csmall.commons.util.PageDataConverter;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class AttributeTemplateServiceImpl implements AttributeTemplateService {

    @Autowired
    AttributeTemplateMapper mapper;
    @Autowired
    SKUMapper skuMapper;
    @Autowired
    SPUMapper spuMapper;
    @Autowired
    AttributeMapper attributeMapper;
    @Autowired
    CategoryAttributeTemplateMapper categoryAttributeTemplateMapper;
    @Override
    public void insert(AttributeTemplateInsertParam AttributeTemplateInsertParam) {
        log.debug("开始处理【添加属性模版】的业务，参数：{}", AttributeTemplateInsertParam);
        QueryWrapper<AttributeTemplate> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("name",AttributeTemplateInsertParam.getName());
        int countByName = mapper.selectCount(queryWrapper);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countByName);
        if(mapper.selectCount(queryWrapper)>0){
            String message="添加属性模版失败，属性模版ID已被占用!";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_CONFLICT);
        }


        AttributeTemplate AttributeTemplate=new AttributeTemplate();
        BeanUtils.copyProperties(AttributeTemplateInsertParam,AttributeTemplate);
        AttributeTemplate.setGmtCreate(LocalDateTime.now());
        AttributeTemplate.setGmtModified(LocalDateTime.now());
        log.debug("准备将新的属性模版数据写入到数据库，数据：{}", AttributeTemplate);
        int row = mapper.insert(AttributeTemplate);
        if(row !=1){
            String message="添加管理员失败，服务器忙，请稍后再试!";
            log.warn(message);
            throw new ServiceException( message,ServiceCode.ERR_INSERT);
        }
        log.debug("将新的属性模版数据写入到数据库，完成！");
    }

    @Override
    public void deleteById(Long attributeTemplateId) {
        log.debug("开始处理【删除属性模版】的业务，参数：{}", attributeTemplateId);
        // 检查属性模版是否存在，如果不存在，则抛出异常
        QueryWrapper<AttributeTemplate> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("id", attributeTemplateId);
        int countById = mapper.selectCount(queryWrapper1);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countById);
        if (countById == 0) {
            String message = "删除属性模版失败，属性模版数据不存在！";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_NOT_FOUND);
        }
        //检查是否有SKU关联此属性模版
        QueryWrapper<SKU> queryWrapper2=new QueryWrapper<>();
        queryWrapper2.eq("attribute_template_id",attributeTemplateId);
        int countByAttributeTemplateId2 = skuMapper.selectCount(queryWrapper2);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countByAttributeTemplateId2);
        if(countByAttributeTemplateId2>0){
            String message="删除属性模版失败，仍有sku关联此属性模版!";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_CONFLICT);
        }
        //检查是否有SPU关联此属性模版
        QueryWrapper<SPU> queryWrapper3=new QueryWrapper<>();
        queryWrapper3.eq("attribute_template_id",attributeTemplateId);
        int countByAttributeTemplateId3 = spuMapper.selectCount(queryWrapper3);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countByAttributeTemplateId3);
        if(countByAttributeTemplateId3>0){
            String message="删除属性模版失败，仍有spu关联此属性模版!";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_CONFLICT);
        }
        //检查是否有属性关联此属性模版
        QueryWrapper<Attribute> queryWrapper4=new QueryWrapper<>();
        queryWrapper4.eq("template_id",attributeTemplateId);
        int countByAttributeTemplateId4 = attributeMapper.selectCount(queryWrapper4);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countByAttributeTemplateId4);
        if(countByAttributeTemplateId4>0){
            String message="删除属性模版失败，仍有属性关联此属性模版!";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_CONFLICT);
        }
        //检查是否有类别关联此属性模版
        QueryWrapper<CategoryAttributeTemplate> queryWrapper5=new QueryWrapper<>();
        queryWrapper5.eq("attribute_template_id",attributeTemplateId);
        int countByAttributeTemplateId5 = categoryAttributeTemplateMapper.selectCount(queryWrapper5);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countByAttributeTemplateId5);
        if(countByAttributeTemplateId5>0){
            String message="删除属性模版失败，仍有类别关联此属性模版!";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_CONFLICT);
        }

        int row = mapper.deleteById(attributeTemplateId);
        if(row !=1){
            String message="添加管理员失败，服务器忙，请稍后再试!";
            log.warn(message);
            throw new ServiceException( message,ServiceCode.ERR_DELETE);
        }
        log.debug("删除完成");
    }

    @Override
    public void update(AttributeTemplateUpdateInfoParam attributeTemplateUpdateInfoParam) {
        log.debug("开始处理【修改属性模版】的业务，参数：{}", attributeTemplateUpdateInfoParam);
        QueryWrapper<AttributeTemplate> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("id",attributeTemplateUpdateInfoParam.getId());
        int countById = mapper.selectCount(queryWrapper);
        log.debug("根据属性模版ID统计匹配的属性模版数量，结果：{}", countById);
        if (countById == 0) {
            String message = "修改属性模版失败，属性模版数据不存在！";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_NOT_FOUND);
        }

        QueryWrapper<AttributeTemplate> queryWrapper2=new QueryWrapper<>();
        queryWrapper2.eq("name",attributeTemplateUpdateInfoParam.getName())
                .ne("id",attributeTemplateUpdateInfoParam.getId());
        int countByName = mapper.selectCount(queryWrapper2);
        log.debug("根据属性模版名称统计匹配的属性模版数量，结果：{}", countByName);
        if(countByName>0){
            String message="修改属性模版失败，属性模版名称已被占用!";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_CONFLICT);
        }


        AttributeTemplate attributeTemplate=new AttributeTemplate();
        BeanUtils.copyProperties(attributeTemplateUpdateInfoParam,attributeTemplate);
        int row = mapper.updateById(attributeTemplate);
        if(row !=1){
            String message="添加管理员失败，服务器忙，请稍后再试!";
            log.warn(message);
            throw new ServiceException( message,ServiceCode.ERR_UPDATE);
        }
        log.debug("修改完成");
    }

    @Override
    public AttributeTemplateStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据ID查询属性模版】的业务，参数：{}", id);
        if(mapper.getStandardById(id)==null){
            String message = "查询属性模版详情失败，属性模版数据不存在！";
            log.warn(message);
            throw new ServiceException(message,ServiceCode.ERR_NOT_FOUND);
        }
        return mapper.getStandardById(id);
    }

    @Override
    public PageData<AttributeTemplateListVO> list(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        List<AttributeTemplateListVO> list = mapper.list();
        PageInfo<AttributeTemplateListVO> pageInfo=new PageInfo<>(list);
        PageData<AttributeTemplateListVO> pageData= PageDataConverter.convert(pageInfo);
        return pageData;
        
    }

    @Override
    public PageData<AttributeTemplateListVO> list(Integer pageNum) {
        Integer pageSize=5;
        return list(pageNum,pageSize);
    }

}
